#理解：继承扩展
#继承存在的意义：将公共的方法提取到父类之中，有利于增加代码的重用性
#单继承和多继承
#
#mro和c3算法
#如果类中存在继承关系，可以通过   mro()获取当前类的继承关系
# class c(object):
#     pass
# class b(object):
#     pass
# class a(b,c):
#     pass
# print(a.mro())
# print(a.__mro__)
import requests

# class d(object):
#     pass
# class c(d):
#     pass
# class b(d):
#     pass
# class a(b,c):
#     pass
# print(a.mro())
# print(a.__mro__)

#c3算法：
#mro(A) = [A] + [B,C]
#mro(A) = [A,B,C]
#mro(a) = [a] + merge( mro(b)+mro(c),[b,c])
#mro(a) = [a] + merge([b,object]+[c,object],[b,c])
#mro(a) = [a] +[b,c,object])  merge,与除了一个元素的其他元素比较是存在，在进行剔除

#特别补充：一句话搞定继承关系
#从左到右，深度优先，大小钻石，留住顶端。
#py2和py3在关于面向对象
#py2.2之前，只支持经典类【从左到右，深度优先，大小钻石，不留顶端】
#后来，python想让默认继承object（其他语言的面向对象基本上也都是默认继承object)，此时发现原来的经典类不能直接集成这个功能，有bug
#所以,python决定不再原来的经典类上进行修改了，而是在创建一个新式类来支持这个功能。【从左到右，深度优先，大小钻石，留住顶端。】

# #经典类
# class a:
#     pass
# #新式类
# class b(object):
#     pass
#这样，py2.2之后就出现了经典类和新式类共存（正式支持2.3）
#最终，python3中抛弃经典，只保留新式类


#内置函数补充
#classmethod、staticmethod、property  以装饰器的形式放在绑定方法的上面，把绑定方法转化为类方法、静态方法、属性

#callable,是否可以再后加括号  如：判断是否是函数
# class Foo(object):
#     def __call__(self,*args,**kwargs):
#         pass
# obj = Foo()
# print(callable(obj))  #True
#所以当你在见到下面的情况的时候，首先就要想到handler可以是：函数、类、具有call方法的对象，到底具体是什么，需要根据代码的调用关系才能分析出来
# def do_something(handler):
#     handler()

#super,按照mro的继承关系向上找成员
#假设有一个类，他原来已经实现了某些功能，但是我们想在它的基础上再扩展一点功能，重写一遍比较麻烦，此时就可以使用super
# class Base(object):
#     def message(self,num):
#         print("Base.message",num)
# class Child(Base):
#     def message(self,num):
#         print("Child.message",num)
#         super().message(num+100)
# obj=Child()
# obj.message(1)

#易错点
# class Base(object):
#     def message(self,num):
#         #print("Base.message",num)
#         super().message(num+100)
# class Bar(object):
#     def message(self,num):
#         print("Bar.message",num)
# class Child(Base,Bar):
#     pass
# obj = Child()
# obj.message(1)
#type 获取一个对象的类型
#isinstance,判断对象是否是某个对象的实例
# class B(object):
#     pass
# class A(B):
#     pass
# obj = A()
# print(isinstance(obj, A)) #True
# print(isinstance(obj, B)) #True

#issubclass，判断是否是某个类的子孙类
# class Top(object):
#     pass
# class A(Top):
#     pass
# class B(A):
#     pass
# class C(B):
#     pass
# print(issubclass(C,Top))
# print(issubclass(B,C))
# print(issubclass(C,B))

#异常处理
#在程序开发中如果遇到一些不可预知的错误或你懒的做一些判断的时候，可以选择异常处理来做

# while True:
#     url=input("Enter a url: ")
#     try:
#         res=requests.get(url)
#     except Exception as e:#e是一个对象，包含出现的错误信息
#         print("请求失败，原因{}".format(str(e)))
#         continue
#     with open('ooontent.txt',mode='wb') as f:
#         f.write(res.content)
#以后常见的应用场景：
#1、调用微信的API实现微信消息的推送，微信支付
#2、支付宝支付、视频播放等等
#3、数据库或redis连接和操作
#4、调用第三方的视频和播放的功能，由第三方的程序出问题导致的错误

#懒得判断的场景
# num1=input("Enter a number：")
# num2=input("Enter another number：")
# try:
#     num1=int(num1)
#     num2=int(num2)
#     ret=num1+num2
#     print(ret)
# except Exception as e:
#     print("输入错误")

#异常处理的基本格式
#格式一，见到的比较多
# try:
#     #逻辑代码
# except Exception as e:
#     #try中的代码块如果有异常，则此代码块中的代码就会执行
#格式二
# try:
#     #逻辑代码
# except Exception as e:
#     #try中的代码块如果有异常，则此代码块中的代码就会执行
# finally:  #一般做资源的释放就会用到finally

# try:
#     file_obj=open("info.txt",mode="r")
# except Exception as e:
#     #异常处理
# finally:
#     file_obj.close()
#     #try中没异常，最后执行finally关闭文件；try有异常,执行except中的逻辑，最后再执行finnay关闭文件





